home *** CD-ROM | disk | FTP | other *** search
/ Mac Power 1997 December / MACPOWER-1997-12.ISO.7z / MACPOWER-1997-12.ISO / AMUG / PROGRAMMING / Raven 1.2.sit / Raven 1.2 / Documents / Change History < prev    next >
Text File  |  1997-09-08  |  23KB  |  383 lines

  1. // ===================================================================================
  2. //    Raven 1.2                                                        September 8, 1997
  3. // ===================================================================================
  4.  
  5. Known Bugs:
  6.     ・ハStack crawl doesn't have symbol names if virtual memory is on.
  7.     ・ TStaticText now uses the Appearance Manager if it's installed. Unfortunately
  8.       it's ignoring the foreColor in the ControlFontStyleRec record and appears to
  9.       always use black (even though Appearance.h says that it should work).
  10.     
  11. General Notes:
  12.     ・ハSince CW Pro now allows you to precompile the standard C++ headers the sample
  13.       projects set PRECOMPILE_RAVEN_HEADERS to 1. However in trying this I experienced
  14.       problems stepping into template code that was precompiled...
  15.     ・ Raven has been updated to work with the Appearance Manager. This means you'll
  16.       have to weak link to ApperanceLib (if the Appearance Manager isn't installed
  17.       Raven will fall back to a System 7 implementation).
  18.     ・ There have been a lot of changes to Raven. I think all the major changes are
  19.       mentioned below, but it's possible I missed a few.
  20.          
  21. Bug Fixes and Design Changes:
  22.     ・ハIn an effort to be more compatible with STL and to reduce the neccesity to cast
  23.       when warn_implicitconv is on I've moved towards using ulong instead of short or
  24.       long in the interfaces.
  25.     ・ハRaven no longer uses 'STR#' resources to look up strings. Instead Raven provides
  26.       LoadRavenString and LoadAppString functions that look up hard coded strings in
  27.       a table. For example, instead of something like LoadIndString(256, 5) you would
  28.       write LoadAppString("Foo"). LoadAppString would look up "Foo" in a 'StrM' resource
  29.       with id 256 and if "Foo" is in the resource a replacement string would be returned.
  30.      ・ TDocument::HandleSaveAs returns false if there was an error. This way CanClose 
  31.        will return false giving the user an opportunity to save to a different drive or 
  32.        to not save at all.
  33.      ・ハTWindow::Invariant no longer objects when clicking in title bar of collapsed window.
  34.      ・ TToolWindow wasn't properly saving the visible flag when it was closed (so tool
  35.        windows were always visible when the app was re-launched). This has been fixed.
  36.     ・ハIn Raven 1.1 a pane's active attribute worked like the visible attribute: if the
  37.       window was active a subpane could be active or inactive. If the window was inactive
  38.       all of its subpanes were also inactive. Since this doesn't seem to make much sense
  39.       and gave me problems I've changed the semantics so that panes are always active if
  40.       the window is active and always inactive when the window is inactive.
  41.     ・ハThe applicable pane classes now support the Appearance Manager. This has entailed
  42.       some changes:
  43.         * Group box no longer supports colors other than gray. Secondary group boxes are
  44.           now supported.
  45.         *ハTDisclosureArrow no longer supports medium or large sizes.
  46.         *ハRenamed TCaption TStaticText. Added Enable and Disable methods.
  47.     ・ TScroller::OnActivating and OnDeactivating call the Inherited method.
  48.     ・ TScroller ctors created horz scrollbar if hasVertBar and vice versa.
  49.     ・ TScrollBar uses the original mouse position when deciding where in the scroll box
  50.       the user clicked. This way the code works properly on slow machines with fast mousers.
  51.     ・ Fixed for loop bug in TBaseTableView::GetCellFromPt.
  52.     ・ハTControl has members holding the help text for the checked and disabled states. In
  53.       earlier versions these were always used. Now TControl::OnGetBalloonHelp uses TPane's
  54.       help text if TControl's text is empty.
  55.     ・ハTAdorner uses mIndent instead of GetExtent overrides. The GetExtent override didn't
  56.       work because TPane overrode RemoveAdorner and called GetExtent to determine how much
  57.       to invalidate. Unfortunately RemoveAdorner was called by the TAdorner dtor which
  58.       meant the subclasse's GetExtent was no longer called.
  59.     ・ハIn Raven 1.1 TTracker did not always call OnTrackContinue. Raven 1.2, on the other
  60.       hand, always calls OnTrackContinue at least once. This means that OnTrackStart
  61.       should be used only for initialization, OnTrackContinue should perform the action,
  62.       and OnTrackStop should handle cleanup.
  63.     ・ TRubberBandTracker no longer caches canvas (didn't work when the view auto 
  64.       scrolled).
  65.     ・ハThe TMenu(short, string) ctor was designed to allow you to build menus by hand.
  66.       However versions of Raven prior to 1.2 neglected to allocate mMenuCommands which
  67.       lead to a crash in short order.
  68.     ・ハIn Raven 1.1 TFile::Close was documented to not throw an exception and the dtor
  69.       called Close. This was done to make it easier to write exception safe code. For
  70.       example:
  71.               {
  72.               TFile file(spec); 
  73.                   file.Open(fsWrPerm);
  74.                   
  75.                   file.Write(buffer.GetPtr(), buffer.GetSize());
  76.               }
  77.       If the write failed the file would automatically be closed and because Close
  78.       didn't throw we wouldn't have to worry about an exception being thrown while
  79.       the stack was being unwound. However because the File Manager buffers writes
  80.       FSClose has to flush the buffer which means FSClose may very well fail. To 
  81.       handle this case Close now throws an exception. The dtor now ASSERTs that the
  82.       file is closed and calls Close is it's not (if an exception was thrown you'll
  83.       get an ASSERT but the file will be properly closed). The dtor also traps
  84.       exceptions. The above code should now be written as:
  85.               {
  86.               TFile file(spec); 
  87.                   file.Open(fsWrPerm);
  88.                   
  89.                   file.Write(buffer.GetPtr(), buffer.GetSize());
  90.  
  91.                   file.Close();
  92.               }
  93.     ・ FlushVolume throws instead of ASSERTing.
  94.     ・ TFileSpec and TFolderSpec ctors that resolve aliases no longer throw if the
  95.       target doesn't exist.
  96.     ・ TFileSpec and TFolderSpec ctors that take strings no longer automatically convert 
  97.       the string to a valid file name (by replacing colons with dashes and truncating to 
  98.       31 characters). Instead they ASSERT that the string is valid and, if it's not,
  99.       fix it up.
  100.     ・ MTimer::StartTimer resets mSnapshot (so freq msecs elapse before OnTime is called).
  101.       Added MTimer::ResumeTimer (which works like StartTimer used to).
  102.     ・ハMBroadcaster::Broadcast used to stuff the message into a member before sending it.
  103.       This was pretty gross, but it made it possible for the non-template MBaseBroadcaster
  104.       base class to do all the heavy lifting. Unfortunately this caused problems when a
  105.       broadcast caused a broadcast. This code has been rewritten to be a bit cleaner and
  106.       to fix this problem.
  107.     ・ハThe code in ZDisplays.cpp has been revised using the RequestVideo sample code from
  108.       Apple. New functions have been added to get and restore the state of a device. The
  109.       state includes the Display Manager cookies so it now restores the device to the
  110.       exact old state. Also SetDisplayMode now picks the highest refresh rate.
  111.     ・ Fixed an ASSERT in TMemoryHeap::AddAllocator.
  112.     ・ TSimpleAllocator adjust heap size when allocating huge blocks.
  113.     ・ TRect and TLongRect Pin methods pin to botRight instead of botRight minus one.
  114.     ・ハTLongRect::MapTo uses longs instead of shorts.
  115.     ・ Fixed a bad bug in TQueue::DoExpandBuffer.
  116.     ・ TSetPort no longer crashes if current port is bogus.
  117.     
  118. Changes:
  119.     ・ハHAS_EXPLICIT and HAS_MUTABLE in RavenHeader.h now default to true (for CW Pro1).
  120.     ・ RavenHeader.h includes ansi_parms.h
  121.     ・ Added ENABLE_IMPLICIT_CONV_WARNING macro. This is off by default. If you turn 
  122.       it on ZTypes.h enables the warn_implicitconv warning in the 1.9 compiler. Note
  123.       that there are parts of Raven that have not been compiled with this on.
  124.     ・ TApplication::OnCreateDebugCommander is called after OnInit (so the Debug menu
  125.       appears after the Windows menu).
  126.     ・ Add a command to the debug menu to show/hide pane invalidations.
  127.     ・ Made some changes to TDocApplication:
  128.         * If the option key is down the close command becomes close all and the save
  129.           command becomes save all. If the command key is down the close command becomes
  130.           junk all.
  131.         * Added support for the OS 8 'rapp' apple event.
  132.         * Renamed GetFile OnGetFile.
  133.     ・ Made some changes to TDocument:
  134.         * HandleSave and HandleSaveAs delete the file if there was an error writing it 
  135.           out.
  136.         * SetDirty and HandleSetDirty now take a data argument (which defaults to nil).
  137.           This is broadcast along with the kChangedDocument message.
  138.         * HandleSaveAs won't save over files whose type is not mFileType.
  139.         * Volume is flushed after saving.
  140.         * SDocumentMessage::document is now a const TDocument pointer.
  141.     ・ Added TDocWindow::Create.
  142.     ・ Made some changes to TWindow:
  143.         * mLatentTarget no longer has to be a subpane.
  144.         * Removed OnSelect. (This was never called and never made much sense).
  145.         * Implemented auto-positioning.
  146.     ・ Added support for opaque panes. A pane is opaque if it's visible and has an opaque
  147.       adorner (eg TEraseAdorner) or the mOpaque member is set. TView::HandleDraw clips
  148.       any opaque subpanes before drawing itself. This can significantly reduce flashing.
  149.     ・ TView::OnSubPaneScrolled, OnSubPaneChangedSize, and OnSubPaneChangedLocation
  150.       now have a redraw argument.
  151.     ・ Added TScroller::mEraseOnUpdate.
  152.     ・ TStringListBox broadcasts when selection changes or user double clicks.
  153.     ・ Worked on TBaseTableView:
  154.         * Made GetRowHeight and GetColWidth public. Made mNumCols and mRows protected.
  155.         * Added support for selections. 
  156.         * Added ScrollIntoView.
  157.         * Replaced OnMouseDownCell with OnDoubleClickCell.
  158.         * Added TTableSelection, TRowSelection, and TCellSelection.
  159.     ・ Tweaked scroll bar positioning in TListBoxBase. OnMouseDown handles click after 
  160.       switching target. AdjustScrollBar calls SetPageDelta.
  161.     ・ハChanged TScrollableView overhang reconciliation to reduce flashing.
  162.     ・ハTCheckBox and TRadioButton support mixed state.
  163.     ・ Added context menus to TColorSwatch.
  164.     ・ DoNote, DoCaution, and DoStop use StandardAlert if it's available. (They also take 
  165.       a second string).
  166.     ・ TMenuBar uses MenuEvent instead of MenuKey (if Appearance Manager).
  167.     ・ TMenuBar::GetCommandFromKey and DefaultFilterProc use IsCommandPeriod() (which works
  168.       with non-US keyboards).
  169.     ・ Removed SCommandStatus::usesMark.
  170.     ・ハTContextMenu uses Context Menu Manager if it's installed.
  171.     ・ Added TDragSession::SetClippingPrefix and SetClippingName (which are used by
  172.       the OS 8 Finder).
  173.     ・ Made some undo related changes:
  174.         * Removed transaction support from TUndoMgr. Added TMultipleUndoableCommand.
  175.         *ハRemoved Abort methods from TUndoableCommand.
  176.         *ハAdded TUndoableCommand::IsValid. Subclasses can override this and return false 
  177.           when they can no longer do anything useful (TSafePtr (see below) can help with 
  178.           this).
  179.         * TUndoMgr has been updated to delete invalid commands.
  180.     ・ハTTracker::OnTrackStop now only has a stopPt argument.
  181.     ・ TStdScoreDeviceFn gives modes at the current resolution a slightly higher score
  182.       (this is useful when your app doesn't care what resolution it runs at). 
  183.     ・ FindPreferredDevice short cuts search if current mode suffices.
  184.     ・ TSetPort (GrafPtr) ctor now takes an optional GDHandle.
  185.     ・ Added TColorTable(PaletteHandle).
  186.     ・ハAdded TPicture::Write. Added a ctor to create a picture from a TGWorld.
  187.       ・ Made some changes to streaming code:
  188.         * TOutHandleStream ctor allows clients to specify a reserve size.
  189.         * operator>>(TInStream, double) byte swaps if neccesary.
  190.         * Added stream operators for vector, list, map, and set.
  191.         * Added streaming operators to TQueue.
  192.     ・ Added UFileSystem::SpecExists and IsValidName.
  193.     ・ UFileSystem::GetUniqueFile uses SpecExists instead of FileExists.
  194.     ・ハTFolderSpec::GetTempFolder and GetTrashFolder allow you to optionally specify a 
  195.         volume.
  196.     ・ Added assembly glue allowing float to string functions to work with long doubles.
  197.     ・ハTRegularExpression has been reimplemented using finite automata. This makes matching
  198.       much faster but constructing the TRegularExpression object may take a bit longer.
  199.     ・ Renamed EqualReal Equal.
  200.     ・ Abs() functions use intrinsics on PPC.
  201.     ・ Made TVector a template class. Added operator*(T, TVector).
  202.     ・ TPoint and TLongPoint operator <, <=, >, and >= check v first. This way points
  203.       can be sorted so that the topLeft points are first and botRight are last.
  204.     ・ Added TPoint and TLongPoint Distance friend functions.
  205.     ・ PRECONDITION macro casts 'this' to an MInvariant*. This allows the PRECONDITION
  206.       and POSTCONDITION macros to be used inside a mixin. 
  207.     ・ MBaseEditableObject, MBehaviorableBase, MCommander, and MLockable use PRECONDITION 
  208.       and POSTCONDITION macros.
  209.     ・ Added non-virtual Invariant to MCommander.
  210.     ・ Added an Invariant to ZHandleRef. OnLock now adds a tail to the handle.
  211.     ・ Added ulong versions of all the int conversion functions (in ZIntConversions.h).
  212.     ・ハTAppBootStrap::OnInitSioux now always puts SIOUX on the main monitor
  213.     ・ TSystemException and ThrowIfOSErr use OSStatus instead of OSErr. (Some of the
  214.       newer manager return OSStatus. Since this is a long there's a chance of data
  215.       loss when using OSErr).
  216.     ・ Added kActivatingWindow and kDeactivatingWindow to TStateBroadcaster.
  217.     ・ Made some changes to the Skeleton project:
  218.         * Rewrote Skeleton.r Edit menu balloon help.
  219.         * Added a 68K stub to Skeleton project. (This is a tiny 68K app that tells the
  220.           user that he need a PPC to run the app).
  221.         * Created Debug, Release, and Profile targets in the Skeleton project.
  222.     ・ TMemoryHeap block count functions are defined if !RELEASE (instead of if DEBUG).
  223.     ・ Added TMemoryHeap::DumpCommonBlocks and DumpAllocatorCapacities. You can use these
  224.       to determine if the fixed allocators you're using are still OK in builds (to do
  225.       this build a !DEBUG and !RELEASE version of your app and call DumpCommonBlocks and 
  226.       DumpAllocatorCapacities at the end of main).
  227.     ・ハTProfiler uses bestTimeBase instead of microsecondsTimeBase. (This will cause 
  228.       PPCTimeBase to be used on a PPC which yields much less of a speed hit than
  229.       microsecondsTimeBase).
  230.     ・ TProfiler warning for too small numFunctions and stackDepth now reports correct
  231.         required values.
  232.         
  233. Additions:
  234.     ・ハAdded SGI STL to Extras. Unlike the MSL in CW Pro1 this library is exception
  235.       safe and includes extensive debugging support. It also produces smaller
  236.       executables.
  237.     ・ Added ZDialogBoxes.h and cpp which contain functions that make it very easy to
  238.       handle simple Quill style input dialogs.
  239.     ・ Added TPatternSwatch. When this is clicked it pops up a menu that allows the user
  240.       to pick one of the standard patterns.
  241.     ・ Added TPopupTable. This is a TSimpleTableView that functions like a popup menu.
  242.       TPatternSwatch uses this to popup the pattern menu.
  243.     ・ Added TVisualSeparator. This is a simple divider line that works correctly with
  244.       the Appearance Manager.
  245.     ・ Added TPicturePane.
  246.     ・ Added TStandardGetFile, TStandardGetFileOrFolder, and TStandardPutFile. These
  247.       provide a framework for easily extending a custom standard file dialog with 
  248.       filter and hook functions.
  249.     ・ Added an Automata folder to Esoterica. This contains deterministic and non-
  250.       deterministic finite automata classes.
  251.     ・ Brand new parser classes have been added to Esoterica:Parser. These classes provide
  252.       a powerful framework for implementing recursive descent parsers. (The old TParser
  253.       class has been renamed TSimpleParser and can still be useful for simple jobs).
  254.     ・ハAdded THSVColor.
  255.     ・ Added a templatized 2D array called TArray. (This is a generic array, if you're
  256.       storing floats you probably want to use TMatrix).
  257.     ・ Added a sparse templatized 2D array called TSparseArray.
  258.     ・ Added TSet. This is a wrapper around STL's set class that behaves more like a set
  259.       in mathematics. For example you can get the intersection of two sets by typing
  260.       s1 & s2 and you can add a new element with s1 += elem.
  261.     ・ Added TSafePtr. This is a smart pointer class that gets notified when its target
  262.       is destroyed. You can check to see if the pointer is OK to use by calling the
  263.       TargetExists method.
  264.     ・ Added a template TComplex class. This is similar to the standard's complex class
  265.       except that it provides direct access to the real and imaginary members.
  266.     ・ Added xdouble. This is the long double class from the LiDIA math package.
  267.     ・ Added int and double versions of Random.
  268.     
  269.  
  270. // ===================================================================================
  271. //    Raven 1.1                                                            Apr 16, 1997?
  272. // ===================================================================================
  273. Known Bugs:
  274.     ・ハStack crawl doesn't have symbol names if virtual memory is on.
  275.     
  276. Bug Fixes and Design Changes:
  277.     ・ In Raven 1.0 the PRECONDITION and POSTCONDITION macros looked like this:
  278.             #define    PRECONDITION(x)        this->Invariant(); ASSERT(x)
  279.             #define    POSTCONDITION(x)    this->Invariant(); ASSERT(x)
  280.       This was nice and simple, but caused problems because the Invariant should only
  281.       be called from within public methods (because the invariants may temporarily become
  282.       invalid in a protected method). I tried to handle this by only calling protected
  283.       methods from protected methods, but this isn't always feasible. So, I wound up
  284.       removing the invariant checks from some public methods. Raven 1.1 handles this
  285.       using a new MInvariant mixin and a new stack based class:
  286.             #define    PRECONDITION(x)        ASSERT(x); ZCheckInvariant _check(this)
  287.             #define    POSTCONDITION(x)    ASSERT(x)
  288.       ZCheckInvariant is a stack based class that increments an MInvariants nesting 
  289.       level and calls the Invariant method if the nesting level is one. By doing this 
  290.       the Invariant function is only called at the start and end of the original public 
  291.       method. This has the following implications:
  292.               1) You need to descend from MInvariant if you want to use PRECONDITION and 
  293.                  POSTCONDITION.
  294.               2) You can only call PRECONDITION once per method.
  295.               3) You shouldn't call PRECONDITION in a dtor (since the invariant doesn't
  296.                  usually hold when the dtor exits).
  297.     ・ハTDocument::HandleClose was added before documents were ref counted and didn't
  298.       work correctly with TDocWindows (the document was deleted but the doc window wasn't
  299.       and wound up with a dangling pointer to the doc). Because documents are
  300.       supposed to be deleted when their ref count goes to zero HandleClose has been
  301.       removed. If you absolutely must close a document you can use the new ForceClose
  302.       method which broadcasts kForceCloseDocument to the doc's listeners so that they
  303.       can close themselves and thereby decrement the doc's ref count to zero. (This
  304.       fixes a crash when an exception was thrown while a document was opening).
  305.     ・ハThe startOnPreferred flag in TWindow wasn't working correctly when windows were
  306.       reanimated. This has been fixed by adding TWindow::ForceOnPreferred and overriding
  307.       OnReanimated to call ForceOnPreferred.
  308.       ・ Mouse events now bubble down to the correct pane; got rid of Dispatch methods
  309.       in TWindow.
  310.     ・ TCodeTimer and TAverageTimer use the Time Manager to compute an elapsed time in
  311.       microseconds. Unfortunately the toolbox doesn't cleanup Time Manager tasks when
  312.       an app exits. So, if you terminated the app via ExitToShell or the debugger while
  313.       a TCodeTimer or TAverageTimer object was alive you'd get a crash. To fix this these
  314.       classes now descend from the new MExitAction class.
  315.     ・ TWindow only draws size box when the window is active.
  316.     ・ TFileIterator resolves aliases.
  317.     ・ T2DGraph invalidates when plots are added or removed.
  318.     ・ Fixed a bug in TRegularExpression involving consectutive expressions using '*'.
  319.     ・ハLots of small fixes to TBaseTableView and TSimpleTableView.
  320.     ・ Made TRect::Pin const.
  321.  
  322. Changes:
  323.     ・ RavenHeader.h defines __dest_os and __MSL_LONGLONG_SUPPORT__.
  324.     ・ If !DEBUG && ASSERTS_THROW PRECONDITION and POSTCONDITION map to ASSERT (instead 
  325.       of no-ops). 
  326.     ・ハTApplication::Run handles update events without calling WNE.
  327.     ・ Most of Raven's iterator classes have been made STL compliant: this includes
  328.       TWindowIterator, TSubPaneIterator, TFileIterator, and TVolumeIterator.
  329.     ・ Got rid of kOpeningDocument, kClosingDocument, kSavingDocument, and 
  330.         kRevertingDocument document messages.
  331.     ・ Renamed OnBalloonHelp OnGetBalloonHelp. HandleBalloonHelp no longer has a 
  332.       THelpMessage argument.
  333.     ・ T2DGraph supports dragging and the copy command.
  334.     ・ Changed TWindow:
  335.         * Moved IsDoubleClick and IsRightClick from TPane to TWindow.
  336.         * Added OnStagger.
  337.     ・ Got rid of TScale class (T2DAxis uses new TTransform class).
  338.     ・ Worked on regular expressions:
  339.         * Added support for '?' and '|' characters.
  340.         * Added constants for some common regular expressions.
  341.     ・ TBootStrap dtor no longer calls __destroy_global_chain (because MSL C++ 2.1.1
  342.       calls it for us).
  343.     ・ Added TMenu::SetCommandKey.
  344.     ・ Changed geometry classes:
  345.         * Added <, <=, >, and >= operators to TPoint.
  346.         * Added TRect::SetHeight and SetWidth.
  347.     ・ハUCursorUtils::StillBusy only tickles cursor if more than a tick has elapsed
  348.       since the last tickle.
  349.     ・ MTimeMgrTimer descends from MExitAction instead of using an ExitToShell patch.
  350.     ・ Added GetResourceInfo to ZResUtils.h
  351.     ・ Added GetRefNum to TOpenResFile.
  352.     ・ TemporaryZone() no longer caches zone.
  353.     ・ TDebugMenuMgr enables copy and select all commands if SIOUX window is frontmost.
  354.     ・ハTMemoryHeap::Deallocate validates the block before instead of after zapping.
  355.     ・ Added virtualMemIsOn to UGestalt.
  356.     ・ Added GetWorld to TGWorld.
  357.     ・ハAdded window functions to ZFourier.h
  358.     ・ ComputeSpectrum uses averaging to get better results.    
  359.     ・ハAdded some additional TVector ctors.
  360.     ・ Added STL style iterators to TVector.
  361.     ・ Added a unit test to TFileIterator.
  362.     ・ Changed zlib compression files:
  363.         * Added #pragma cplusplus off to all files.
  364.         * Enabled all optimizations in the all files.
  365.         * Trace macro now checks verbose flag (prevents inflate from spewing).
  366.     ・ If the app doesn't have a prefs file the annoying TRACEFLOW categories are
  367.       disabled.
  368.     ・ Removed kEmptyString, kEmptyPascalString, and kUnknownString. 
  369.  
  370. Additions:
  371.     ・ Added QuickDraw 3D wrapper classes (look at the BoxPaint example to see how these
  372.       work).
  373.     ・ハAdded 3D graphing classes (see the new Caw example program).
  374.     ・ Added specializations of STL's copy, copy_backward, and uninitialized_copy to ZTypes.h.
  375.       Also added specializations for geometry types and a few other classes.
  376.     ・ Added a simple matrix class.
  377.     ・ Added MExitAction for objects that need to cleanup when app exits abnormally.
  378.  
  379.  
  380. // ===================================================================================
  381. //    Raven 1.0                                                            Feb 23, 1997?
  382. // ===================================================================================
  383. ・ First public release.